home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 526-550 / disk_527 / toolmanager / source / config.c next >
C/C++ Source or Header  |  1992-05-06  |  12KB  |  414 lines

  1. /*
  2.  * config.c   V1.4
  3.  *
  4.  * configuration file handling
  5.  *
  6.  * (c) 1991 by Stefan Becker
  7.  *
  8.  */
  9. #include "ToolManager.h"
  10.  
  11. /* Tool type keywords in the configuration file, must end with a ':'!! */
  12. static char IconKey[]="ICON:";
  13. static char DummyKey[]="DUMMY:";
  14. static char CLIKey[]="CLI:";
  15. static char WBKey[]="WB:";
  16. #define CONFIGBLOCKEND '#'
  17.  
  18. /* Config entry keywords */
  19. static char AssignKey[]=" = ";
  20. char AliasKey[]="Alias   ";
  21. char RealKey[]="RealName";
  22. char DirKey[]="WorkDir ";
  23. char MenuKey[]="Menu    ";
  24. char HotKKey[]="HotKey  ";
  25. char StackKey[]="Stack   ";
  26. static char ArgsKey[]="Args    ";
  27. char ITypeKey[]="IconType";
  28. char IFileKey[]="IconFile";
  29. static char IPosKey[]="IconPos ";
  30. static char OffKey[]="OFF";
  31. char BrushKey[]="Brush";
  32. char DObjKey[]="Icon";
  33.  
  34. /* miscellaneous */
  35. extern char *ConfigName;
  36. struct Library *AslBase;                     /* Library for file requester */
  37. static char ReqTitle[]="Save Configuration"; /* file requester title */
  38.  
  39. /* Data for syntax error requester */
  40. static struct EasyStruct SyntaxErrES={sizeof(struct EasyStruct),0,MyName,
  41.                                       "Syntax error in configuration file\n"\
  42.                                       "%s, line %ld\n'%s'","Ok"};
  43.  
  44. /* Set the name of the config file */
  45. void SetConfigFileName(char *s)
  46. {
  47.  if (ConfigName) free(ConfigName);
  48.  ConfigName=strdup(s);
  49. }
  50.  
  51. /* Init a config block struct */
  52. void InitConfigBlock(struct ConfigBlock *cb)
  53. {
  54.  cb->cb_Type=255;
  55.  cb->cb_Flags=TNFLAGS_MENU|TNFLAGS_DOBJ;
  56.  cb->cb_Stack=STACKMIN;
  57.  cb->cb_IconX=NO_ICON_POSITION;
  58.  cb->cb_IconY=NO_ICON_POSITION;
  59.  cb->cb_Alias[0]='\0';
  60.  cb->cb_Alias[BUFLEN-1]='\0';
  61.  cb->cb_RealName[0]='\0';
  62.  cb->cb_RealName[BUFLEN-1]='\0';
  63.  cb->cb_WorkDir[0]='\0';
  64.  cb->cb_WorkDir[BUFLEN-1]='\0';
  65.  cb->cb_HotKey[0]='\0';
  66.  cb->cb_HotKey[BUFLEN-1]='\0';
  67.  cb->cb_IconFile[0]='\0';
  68.  cb->cb_IconFile[BUFLEN-1]='\0';
  69. }
  70.  
  71. /* Read one config file entry */
  72. static void ReadConfigBlock(FILE *fh, struct ConfigBlock *cb, int *lines)
  73. {
  74.  register char *cp=cb->cb_TempLine;
  75.  
  76.  while (!feof(fh)) /* if not end of file, read one line into buffer */
  77.   {
  78.    (*lines)++;
  79.  
  80.    if (fgets(cp,BUFLEN+20,fh) && (strlen(cp)>1)) /* Skip empty lines */
  81.     if (*cp==CONFIGBLOCKEND) return;             /* End of entry reached */
  82.     else
  83.      {
  84.       register char *parm;
  85.  
  86.       /* Remove trailing newline */
  87.       if (cp[strlen(cp)-1]=='\n') cp[strlen(cp)-1]='\0';
  88.  
  89.       /* Scan line for '=' */
  90.       parm=strchr(cp,'=');
  91.  
  92.       /* Skip white space */
  93.       if (parm)
  94.        {
  95.         parm++;
  96.         while (*parm && isspace(*parm)) parm++;
  97.        }
  98.  
  99.       /* Valid parameter? */
  100.       if (!parm && !*parm)
  101.        {
  102.         /* No --> Syntax error */
  103.         EasyRequest(NULL,&SyntaxErrES,NULL,ConfigName,*lines,cp);
  104.  
  105.         /* Next line */
  106.         continue;
  107.        }
  108.  
  109.       /* Extract parameter value */
  110.       if (!strnicmp(cp,AliasKey,5))                  /* Alias    = <string> */
  111.        strncpy(cb->cb_Alias,parm,BUFLEN-1);
  112.       else if (!strnicmp(cp,RealKey,8))              /* RealName = <string> */
  113.             strncpy(cb->cb_RealName,parm,BUFLEN-1);
  114.       else if (!strnicmp(cp,DirKey,7))               /* WorkDir  = <string> */
  115.             strncpy(cb->cb_WorkDir,parm,BUFLEN-1);
  116.       else if (!strnicmp(cp,HotKKey,6))              /* HotKey   = <string> */
  117.             strncpy(cb->cb_HotKey,parm,BUFLEN-1);
  118.       else if (!strnicmp(cp,IFileKey,8))             /* IconFile = <string> */
  119.             {
  120.              cb->cb_Flags|=TNFLAGS_ICON;             /* Set icon flag */
  121.              strncpy(cb->cb_IconFile,parm,BUFLEN-1);
  122.             }
  123.       else if (!strnicmp(cp,StackKey,5))             /* Stack    = <number> */
  124.             {
  125.              char *cp1;
  126.  
  127.              cb->cb_Stack=strtol(parm,&cp1,10);
  128.             }
  129.       else if (!strnicmp(cp,ArgsKey,4))              /* Args     = OFF */
  130.             {
  131.              if (!stricmp(parm,OffKey)) cb->cb_Flags|=TNFLAGS_NARG;
  132.             }
  133.       else if (!strnicmp(cp,MenuKey,4))              /* Menu     = OFF */
  134.             {
  135.              if (!stricmp(parm,OffKey)) cb->cb_Flags&=~TNFLAGS_MENU;
  136.             }
  137.       else if (!strnicmp(cp,ITypeKey,8))             /* IconType = Brush */
  138.             {
  139.              cb->cb_Flags|=TNFLAGS_ICON;             /* Set icon flag */
  140.              if (!stricmp(parm,BrushKey)) cb->cb_Flags&=~TNFLAGS_DOBJ;
  141.             }
  142.       else if (!strnicmp(cp,IPosKey,7))              /* IconPos  = <x,y> */
  143.             {
  144.              char *cp1;
  145.  
  146.              cb->cb_Flags|=TNFLAGS_ICON;             /* Set icon flag */
  147.              cb->cb_IconX=strtol(parm,&cp1,10);
  148.              cb->cb_IconY=strtol(cp1+1,&cp1,10);
  149.             }
  150.       else                                           /* Unknown keyword */
  151.        EasyRequest(NULL,&SyntaxErrES,NULL,ConfigName,*lines,cp);
  152.      }
  153.   }
  154. }
  155.  
  156. /* Read configuration file */
  157. void ReadConfigFile()
  158. {
  159.  struct ConfigBlock *cb;  /* Memory block for one config file entry */
  160.  FILE *fh;                /* Filehandle for config file */
  161.  int lines=0;             /* Line counter */
  162.  
  163.  if (cb=malloc(sizeof(struct ConfigBlock)))  /* Get memory */
  164.   {
  165.    register char *cp=cb->cb_TempLine;
  166.  
  167.    if (ConfigName && (fh=fopen(ConfigName,"r"))) /* Scan config file */
  168.     {
  169.      while (!feof(fh)) /* if not end of file, read one line into buffer */
  170.       {
  171.        lines++;
  172.  
  173.        if (fgets(cp,BUFLEN,fh) && (strlen(cp)>1)) /* Skip empty lines */
  174.         {
  175.          InitConfigBlock(cb);
  176.  
  177.          /* Extract tool type */
  178.          if (!strnicmp(cp,IconKey,sizeof(IconKey)-1))        /* ICON: */
  179.           {
  180.            char *cp1;
  181.  
  182.            IconXPos=strtol(cp+sizeof(IconKey)-1,&cp1,10);
  183.            IconYPos=strtol(cp1+1,&cp1,10);
  184.           }
  185.          else if (!strnicmp(cp,DummyKey,sizeof(DummyKey)-1)) /* DUMMY: */
  186.           cb->cb_Type=TNTYPE_DUMMY;
  187.          else if (!strnicmp(cp,CLIKey,sizeof(CLIKey)-1))     /* CLI: */
  188.           cb->cb_Type=TNTYPE_CLI;
  189.          else if (!strnicmp(cp,WBKey,sizeof(WBKey)-1))       /* WB: */
  190.           cb->cb_Type=TNTYPE_WB;
  191.          else                                                /* Syntax error */
  192.           {
  193.            /* Display error requester */
  194.            EasyRequest(NULL,&SyntaxErrES,NULL,ConfigName,lines,cp);
  195.  
  196.            /* Try to skip to end of current block */
  197.            while (!feof(fh))
  198.             {
  199.              lines++;
  200.              fgets(cp,BUFLEN,fh);
  201.              if (*cp==CONFIGBLOCKEND) break;
  202.             }
  203.           }
  204.  
  205.          /* Does a valid config block follow? */
  206.          if (cb->cb_Type!=255)
  207.           {
  208.            /* Read in one config file entry */
  209.            ReadConfigBlock(fh,cb,&lines);
  210.  
  211.            /* Special check for empty dummy tool entries */
  212.            if ((cb->cb_Type==TNTYPE_DUMMY) && (cb->cb_Alias[0]=='\0') &&
  213.                (cb->cb_RealName[0]=='\0'))
  214.             strcpy(cb->cb_Alias," ");
  215.  
  216.            /* Add tool */
  217.            AddToolNode(cb,StartupCD);
  218.           }
  219.         }
  220.       }
  221.      fclose(fh);
  222.     }
  223.  
  224.    free(cb);
  225.   }
  226. }
  227.  
  228. /* Tiny long to string conversion routine */
  229. static void ltoa(char *s, long n)
  230. {
  231.  long i=1000000000;     /* Divisor */
  232.  BOOL inumber=FALSE;    /* Flag */
  233.  
  234.  if (n==-2147483648)    /* Handle special case 2^31*/
  235.   {
  236.    strcpy(s,"-2147483648");
  237.    return;
  238.   }
  239.  
  240.  if (n<0)               /* Handle negativ numbers */
  241.   {
  242.    n=-n;
  243.    *s++='-';
  244.   }
  245.  
  246.  if (n==0) *s++='0';    /* Zero is a special case */
  247.  else while (i)         /* Every other numer goes here */
  248.        {
  249.         *s=n/i+'0';     /* Retrieve leading digit */
  250.         if (*s!='0') inumber=TRUE; /* Suppress leading zero's */
  251.         if (inumber) s++;
  252.         n%=i;           /* Remove digit from number */
  253.         i/=10;          /* next divisor */
  254.        }
  255.  
  256.  *s='\0';               /* Append string terminator */
  257. }
  258.  
  259. /* Write one parameter keyword */
  260. static void WriteParamKey(char *cp, FILE *fh)
  261. {
  262.  fputs(cp,fh);        /* Write keyword */
  263.  fputs(AssignKey,fh); /* Write " = " */
  264. }
  265.  
  266. /* Write one complete config line */
  267. static void WriteConfigLine(char *key, char *parm, FILE *fh)
  268. {
  269.  WriteParamKey(key,fh); /* Write keyword */
  270.  fputs(parm,fh);        /* Write parameter */
  271.  fputc('\n',fh);        /* Write newline */
  272. }
  273.  
  274. /* Write configuration file */
  275. void WriteConfigFile(struct Window *w)
  276. {
  277.  struct FileRequester *req;
  278.  BOOL rc=TRUE;
  279.  char dir[NAMELEN],file[NAMELEN],*cp;
  280.  
  281.  /* ConfigName was NOT set because of low mem situation --> break */
  282.  if (!ConfigName) goto wce0;
  283.  
  284.  /* Open ASL library */
  285.  if (!(AslBase=OpenLibrary(AslName,0))) goto wce0;
  286.  
  287.  /* Split file name */
  288.  cp=FilePart(ConfigName);
  289.  if (cp!=ConfigName) strncpy(dir,ConfigName,cp-ConfigName);
  290.  dir[cp-ConfigName]='\0';
  291.  strncpy(file,cp,NAMELEN);
  292.  
  293.  /* Alloc file requester structure */
  294.  if (!(req=AllocAslRequestTags(ASL_FileRequest,ASL_Hail,ReqTitle,
  295.                                                ASL_Window,w,
  296.                                                ASL_LeftEdge,w->LeftEdge,
  297.                                                ASL_TopEdge,w->TopEdge,
  298.                                                ASL_Dir,dir,
  299.                                                ASL_File,file,
  300.                                                ASL_FuncFlags,FILF_SAVE,
  301.                                                TAG_DONE)))
  302.   goto wce1;
  303.  
  304.  /* Open file requester */
  305.  if (AslRequest(req,NULL))
  306.   if (*req->rf_File)                   /* Valid file name? */
  307.    {
  308.     FILE *fh;
  309.  
  310.     strncpy(dir,req->rf_Dir,NAMELEN);  /* Build complete name */
  311.     AddPart(dir,req->rf_File,NAMELEN);
  312.     SetConfigFileName(dir);
  313.  
  314.     if (fh=fopen(dir,"w"))             /* Open config file */
  315.      {
  316.       register struct ToolNode *tn;
  317.  
  318.       /* Write icon position line */
  319.       if ((IconXPos!=NO_ICON_POSITION) || (IconYPos!=NO_ICON_POSITION))
  320.        {
  321.         fputs(IconKey,fh);
  322.         ltoa(dir,IconXPos);
  323.         fputs(dir,fh);
  324.         fputc(',',fh);
  325.         ltoa(dir,IconYPos);
  326.         fputs(dir,fh);
  327.         fputc('\n',fh);
  328.        }
  329.  
  330.       for (tn=GetHead(&ToolList); tn; tn=GetSucc(tn))
  331.        {
  332.         /* Write tool type */
  333.         switch(tn->tn_Type)
  334.          {
  335.           case TNTYPE_DUMMY:
  336.            fputs(DummyKey,fh);
  337.            break;
  338.           case TNTYPE_CLI:
  339.            fputs(CLIKey,fh);
  340.            break;
  341.           case TNTYPE_WB:
  342.            fputs(WBKey,fh);
  343.            break;
  344.          }
  345.         fputc('\n',fh);
  346.  
  347.         /* Write alias name */
  348.         WriteConfigLine(AliasKey,tn->tn_Node.ln_Name,fh);
  349.  
  350.         /* Write real name */
  351.         if (tn->tn_RealName)
  352.          WriteConfigLine(RealKey,tn->tn_RealName,fh);
  353.  
  354.         /* Write working directory */
  355.         if (tn->tn_WorkDir)
  356.          WriteConfigLine(DirKey,tn->tn_WorkDir,fh);
  357.  
  358.         /* Write stack size */
  359.         if (tn->tn_Stack>STACKMIN)
  360.          {
  361.           WriteParamKey(StackKey,fh);
  362.           ltoa(dir,tn->tn_Stack);
  363.           fputs(dir,fh);
  364.           fputc('\n',fh);
  365.          }
  366.  
  367.         /* Write argument passing state */
  368.         if (tn->tn_Flags&TNFLAGS_NARG)
  369.          WriteConfigLine(ArgsKey,OffKey,fh);
  370.  
  371.         /* Write menu entry status */
  372.         if (!(tn->tn_Flags&TNFLAGS_MENU))
  373.          WriteConfigLine(MenuKey,OffKey,fh);
  374.  
  375.         /* Write HotKey description */
  376.         if (tn->tn_HotKey)
  377.          WriteConfigLine(HotKKey,tn->tn_HotKey,fh);
  378.  
  379.         /* Write icon stuff */
  380.         if (tn->tn_Flags&TNFLAGS_ICON)
  381.          {
  382.           if (!(tn->tn_Flags&TNFLAGS_DOBJ))
  383.            WriteConfigLine(ITypeKey,BrushKey,fh);
  384.  
  385.           if (tn->tn_IconFile)
  386.            WriteConfigLine(IFileKey,tn->tn_IconFile,fh);
  387.  
  388.           if ((tn->tn_Icon->do_CurrentX!=NO_ICON_POSITION) ||
  389.               (tn->tn_Icon->do_CurrentY!=NO_ICON_POSITION))
  390.            {
  391.             WriteParamKey(IPosKey,fh);
  392.             ltoa(dir,tn->tn_Icon->do_CurrentX);
  393.             fputs(dir,fh);
  394.             fputc(',',fh);
  395.             ltoa(dir,tn->tn_Icon->do_CurrentY);
  396.             fputs(dir,fh);
  397.             fputc('\n',fh);
  398.            }
  399.          }
  400.  
  401.         fputc(CONFIGBLOCKEND,fh);     /* Append config entry terminator */
  402.         fputc('\n',fh);               /* Append a new line */
  403.        }
  404.  
  405.       fclose(fh);                      /* Close the config file */
  406.       rc=FALSE;                        /* All OK */
  407.      }
  408.    }
  409.  
  410. wce2: FreeAslRequest(req);
  411. wce1: CloseLibrary(AslBase);
  412. wce0: if (rc) DisplayBeep(NULL);
  413. }
  414.